修改matlab柱状图颜色,怎么修改单个三维柱状图的颜色

function main()

clc;

clear all;

% 文件行号

line_number = 0;

% 线程个数

thread_number = 0;

% 打开文件

fid = fopen('syn.dot');

% 读取数据存储在thread结构体中

% SerialID为线程序列号 ID为线程名称,Attribute为线程的基本信息,SynNumber为与该线程同步关系线程的个数

% SysIDs和SynWeights为与该线程同步关系的线程以及权重值

% Height 标识线程三维柱状图的高度

while 1

nextline = fgetl(fid);   %read a line

if ~ischar(nextline)

break;

else

line_number = line_number + 1;

%disp(nextline);

[m,n]=size(nextline);

% 对特定行的lineData进行处理

if line_number > 1 && line_number < 11

thread_number = thread_number + 1;

v=find(nextline == '[');

w=find(nextline == '"');

thread(thread_number).SerialID = thread_number;

thread(thread_number).ID = char(nextline(2:v-1));

thread(thread_number).Attribute = nextline(w(1)+1:w(2)-1);

thread(thread_number).SynNumber = 0;

thread(thread_number).Height = 100;

end

if line_number > 10 && line_number < 27

h=find(nextline == '-');

v=find(nextline == '[');

l=find(nextline == ')');

w=find(nextline == '"');

ID = nextline(2:h(1)-2);

synID = nextline(h(2)+1:v-1);

synWeight = str2double(nextline(l+1:w(2)-1));

for i=1:thread_number

if(thread(i).ID == ID)

thread(i).SynNumber = thread(i).SynNumber + 1;

thread(i).SysIDs(thread(i).SynNumber) = str2double(synID);

thread(i).SynWeights(thread(i).SynNumber) = synWeight;

break;

end

end

for i=1:thread_number

if(thread(i).ID == synID)

thread(i).SynNumber = thread(i).SynNumber + 1;

thread(i).SysIDs(thread(i).SynNumber) = str2double(ID);

thread(i).SynWeights(thread(i).SynNumber) = synWeight;

break;

end

end

end

end

end

% 将主线程的高度变高

thread(9).Height = thread(9).Height * 1.8;

Z = rand(3, 3);

% 将各个线程按顺序 按列排 第一列 1 2 3 第二列 4 5 6

for i=1:3

for j=1:3

Z(j,i) = thread((i-1)*3+j).Height;

end

end

% global hfig

% hfig = figure;

hb = bar3(Z, 0.5, 'detached');

view(-52,62);

renderCDataByHeight(hb, true);

title('通信关系三维可视化');

xlabel('X'), ylabel('Y'), zlabel('Z')

% 输入你要查看的线程

stringINFO = ['请输入你要查看的线程编号','[', num2str(1), '-', num2str(thread_number), ']', ':'];

% threadID = input(stringINFO);

prompt = {stringINFO};

dlg_title = '消息';

num_lines = 1;

def = {'1'};

answer = inputdlg(prompt,dlg_title,num_lines,def);

threadID = str2num(answer{1});

x = fix((threadID+2)/3);

y = threadID - (x-1)*3;

% 显示该线程的基本信息

[m,n] = size(thread(threadID).Attribute);

h=find(thread(threadID).Attribute == '\');

thInfo = thread(threadID).Attribute;

x1 = thInfo(1:h(1)-1);

x2 = thInfo(h(1)+2:h(2)-1);

x3 = thInfo(h(2)+2:h(3)-1);

x4 = thInfo(h(3)+2:n);

text(x-0.3, y-0.3, thread(threadID).Height + 60, x1, 'color', 'k');

text(x-0.3, y-0.3, thread(threadID).Height + 40, x2, 'color', 'k');

text(x-0.3, y-0.3, thread(threadID).Height + 20, x3, 'color', 'k');

text(x-0.3, y-0.3, thread(threadID).Height + 0, x4, 'color', 'k');

[m,n] = size(thread(threadID).SysIDs);

% 权重越大,颜色越深

perColor = 0.5/n;

baseColor = 0.7;

for i=1:n

TempSysID = thread(threadID).SysIDs(i); % 逐个处理同步关系的线程

for j=1:thread_number

if(str2num(thread(j).ID) == TempSysID) % 通过ID号寻找线程序列编号

%计算该同步关系的线程是哪个?

x = fix((thread(j).SerialID+2)/3);

y = thread(j).SerialID - (x-1)*3;

% 显示与线程之间存在同步关系线程的权值

text(x, y, thread(j).Height, num2str(thread(threadID).SynWeights(i)), 'color', 'r');

xdata = get(hb(x), 'Xdata');

ydata = get(hb(x), 'Ydata');

zdata = get(hb(x), 'Zdata');

cdata = get(hb(x), 'Cdata');

baseColor = baseColor - perColor;

surface(xdata((y-1)*6+1:(y-1)*6+6,1:4), ydata((y-1)*6+1:(y-1)*6+6,1:4),...

zdata((y-1)*6+1:(y-1)*6+6,1:4), cdata((y-1)*6+1:(y-1)*6+6,1:4), 'FaceColor', [baseColor 0.2 0.7]);

break;

end

end

end

%     xdata = get(hb(3), 'Xdata');

%     ydata = get(hb(3), 'Ydata');

%     zdata = get(hb(3), 'Zdata');

%     cdata = get(hb(3), 'Cdata');

%     surface(xdata(13:18,1:4), ydata(13:18,1:4), zdata(13:18,1:4), cdata(13:18,1:4), 'FaceColor', [0.4 1 1]);

% % 显示线程1基本信息

% text(1, 1, 100, thread(1).Attribute, 'color', 'b');

% % 显示线程1之间存在同步关系线程的权值

% text(1, 2, 100, num2str(thread(1).SynWeights(1)), 'color', 'r');

% text(1, 3, 100, num2str(thread(1).SynWeights(2)), 'color', 'r');

% text(2, 1, 100, num2str(thread(1).SynWeights(3)), 'color', 'r');

% text(2, 3, 100, num2str(thread(1).SynWeights(4)), 'color', 'r');

% text(3, 3, 180, num2str(thread(1).SynWeights(5)), 'color', 'r');

% 显示线程2基本信息

% text(1, 2, 100, thread(2).Attribute, 'color', 'b');

% 显示线程2之间存在同步关系线程的权值

% text(1, 1, 100, num2str(thread(2).SynWeights(1)), 'color', 'r');

% text(2, 1, 100, num2str(thread(2).SynWeights(2)), 'color', 'r');

% text(2, 3, 100, num2str(thread(2).SynWeights(3)), 'color', 'r');

% hold on;

% set(hb, 'ButtonDownFcn', @click_ceshi);

fclose(fid);

function click_ceshi(src, event)

global hfig

% 获取当前点坐标

xy = get(hfig, 'CurrentPoint');

% 获取gcf和gca的位置信息

hpos = get(hfig, 'Position');

apos = get(gca, 'Position');

% 更新点的信息,获取点针对于gca的准确坐标信息

x = (xy(1) - apos(1)*hpos(3))/(apos(3)*hpos(3));

y = (xy(2) - apos(2)*hpos(4))/(apos(4)*hpos(4));

xlim = get(gca, 'XLim');

ylim = get(gca, 'YLim');

x = x*(xlim(2) - xlim(1)) + xlim(1);

y = y*(ylim(2) - ylim(1)) + ylim(1);

% 标注

text(x, y, 'Happy', 'color', rand(3, 1));

function renderCDataByHeight(hb, interp)

% hb为bar3返回的三维柱状图句柄,

% 对hb的各柱子按高度渲染CData属性,

% interp指定是否渐变(默认为false)

% interp==true:每个柱子从下到上颜色渐变

% interp==false:每个柱子一种颜色

% hb中句柄个数等于数据列数,hb(j)为第j列数据的句柄

if nargin == 1

% interp默认值

interp=false;

end

if interp == true

%每个柱子从下到上颜色渐变

%shading interp;

for j = 1 : length(hb)

% 用Zdata属性去填充Cdata属性

zdata = get(hb(j), 'Zdata');

%set(hb(j), 'Cdata', zdata);

set(hb(j), 'FaceColor', [0.9 1 1]);

% 设置边线颜色

set(hb, 'EdgeColor', [0.5 0.5 0.5]);

end

%     xdata = get(hb(3), 'Xdata');

%     ydata = get(hb(3), 'Ydata');

%     zdata = get(hb(3), 'Zdata');

%     cdata = get(hb(3), 'Cdata');

%     surface(xdata(13:18,1:4), ydata(13:18,1:4), zdata(13:18,1:4), cdata(13:18,1:4), 'FaceColor', [0.4 1 1]);

else

% 每个柱子一种颜色

for j = 1:length(hb)

% 设置hb(j)的Cdata属性

% 制作CData新值cdata用以替换其旧值

% cdata将在ZData的基础上修改而成

cdata = get(hb(j), 'ZData');

% cdata行数除以6就是数据行数

m = size(cdata,1)/6;

% 填充cdata

for i = 1:m

% 设置cdata中(i,j)数据对应的6行

% 将这6行的值均填充(i,j)数据的值

vij = cdata((i-1)*6+2,2);%可由cdata(ZData)中获得(i,j)数据的值

cdata((i-1)*6+1:(i-1)*6+6,:) = vij;%(i,j)数据对应的6行填充完毕

end

set(hb(j), 'Cdata', cdata);%将cdata赋给Cdata属性

end

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值